package com.kurt.service;

import com.kurt.dto.SysConfigDTO;
import com.kurt.dto.create.SysConfigCreateRequest;
import com.kurt.dto.query.SysConfigQueryRequest;
import com.kurt.dto.update.SysConfigUpdateRequest;
import com.kurt.entity.SysConfig;
import org.springframework.data.domain.Page;

import java.util.List;

/**
 * 系统配置服务接口
 */
public interface SysConfigService extends BaseService<SysConfig, Long> {

    /**
     * 创建系统配置
     *
     * @param createRequest 创建请求
     * @return 配置信息
     */
    SysConfigDTO createConfig(SysConfigCreateRequest createRequest);

    /**
     * 更新系统配置
     *
     * @param updateRequest 更新请求
     * @return 配置信息
     */
    SysConfigDTO updateConfig(SysConfigUpdateRequest updateRequest);

    /**
     * 分页查询系统配置
     *
     * @param queryRequest 查询请求
     * @return 分页结果
     */
    Page<SysConfigDTO> getConfigPage(SysConfigQueryRequest queryRequest);

    /**
     * 查询系统配置列表
     *
     * @param queryRequest 查询请求
     * @return 配置列表
     */
    List<SysConfigDTO> getConfigList(SysConfigQueryRequest queryRequest);

    /**
     * 根据配置键名获取配置值
     *
     * @param configKey 配置键名
     * @return 配置值
     */
    String getConfigValue(String configKey);

    /**
     * 根据配置键名获取配置值（带默认值）
     *
     * @param configKey    配置键名
     * @param defaultValue 默认值
     * @return 配置值
     */
    String getConfigValue(String configKey, String defaultValue);

    /**
     * 根据配置键名获取配置对象
     *
     * @param configKey 配置键名
     * @return 配置对象
     */
    SysConfigDTO getConfigByKey(String configKey);

    /**
     * 检查配置键名是否存在
     *
     * @param configKey 配置键名
     * @return 是否存在
     */
    boolean existsByConfigKey(String configKey);

    /**
     * 检查配置键名是否存在（排除指定ID）
     *
     * @param configKey 配置键名
     * @param excludeId 排除的ID
     * @return 是否存在
     */
    boolean existsByConfigKeyAndIdNot(String configKey, Long excludeId);

    /**
     * 批量删除配置
     *
     * @param ids 配置ID列表
     * @return 删除结果
     */
    boolean deleteConfigs(List<Long> ids);

}
